#pragma once
#include <string>
#include <array>
#include <memory>
#include <list>
#include <mutex>
#include <string>

#include "zucmotcfg.h"

#define CMD_CLASS_NAME(x) "[" #x "]"
namespace mot {
// 若指令不涉及到不同机器人的操作，可直接使用该接口
class RtCmdItf
{
public:
    virtual ~RtCmdItf() {}
    /**
     * @brief 在call阶段的回调函数，用于检查当前命令是否可以执行
    */
    virtual int active() { return active_callback(); }
    virtual int active_callback() { return -1; }
    /**
     * @brief 触发执行时的回调函数，用于执行具体的命令
    */
    virtual int process() = 0;
    std::string cmd_name_ = "MotCmdItf";
};

// 若指令会涉及到不同机器人的操作，则使用该接口，接口中默认会检查机器人是否存在
class MultiRobCmd : public RtCmdItf
{
public:
    virtual ~MultiRobCmd() {}
    /**
     * @brief 仅检查机器人是否存在
    */
    virtual int active() override;
    /**
     * @brief 检查其余执行条件，该类的子类需要重写该函数已实现自定义检查
    */
    virtual int active_callback() override { return 0; }

    int group_id_ = 0;
};

class RtCmdSvr
{
public:
    RtCmdSvr();
    int call(std::shared_ptr<RtCmdItf> cmd);
    void update();

private:
    std::list<std::shared_ptr<RtCmdItf>> cmd_list_;
    std::mutex mtx_;
};

int realtime_cmd_call(std::shared_ptr<mot::RtCmdItf> cmd);
}  // namespace mot
